package com.ccsoft.netty.heartbeat.server;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;

/**
 * @author chanchaw
 * @create 2022-07-20 14:45
 */
public class ServerHandler extends ChannelInboundHandlerAdapter {
    // 一开始设计的逻辑中服务端检测到读空闲（客户端没有发送数据来）则主动断开连接
    // 为节省服务器资源，后来客户端增加了重连的功能就废弃了该功能
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if(evt instanceof IdleStateEvent){
            IdleState state = ((IdleStateEvent)evt).state();
            // 出现读空闲状态则断开与客户端的连接 - 节省服务器资源
            if(state == IdleState.READER_IDLE){
//                System.out.println("由于超时没有接收到客户端连接，服务端主动关闭连接");
//                ctx.disconnect();
                System.out.println("超时没有读取到客户端心跳，但是由于使用了重试策略，服务端不再主动关闭连接~~~");
            }
        }else{
            super.userEventTriggered(ctx, evt);
        }
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        System.out.println("客户端[" + channel.remoteAddress() + "]断开了连接！");
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        System.out.println("客户端[" + channel.remoteAddress() + "]上线了！");
    }
}
